package com.mazaiting.accessibility.util

import android.app.ActivityManager
import android.content.Context
import android.content.Intent
import android.provider.Settings
import android.view.accessibility.AccessibilityNodeInfo
import com.mazaiting.accessibility.base.AccessibilityOperator
import com.mazaiting.log.L

/***
 *
 *
 *                                                    __----~~~~~~~~~~~------___
 *                                   .  .   ~~//====......          __--~ ~~
 *                   -.            \_|//     |||\\  ~~~~~~::::... /~
 *                ___-==_       _-~o~  \/    |||  \\            _/~~-
 *        __---~~~.==~||\=_    -_--~/_-~|-   |\\   \\        _/~
 *    _-~~     .=~    |  \\-_    '-~7  /-   /  ||    \      /
 *  .~       .~       |   \\ -_    /  /-   /   ||      \   /
 * /  ____  /         |     \\ ~-_/  /|- _/   .||       \ /
 * |~~    ~~|--~~~~--_ \     ~==-/   | \~--===~~        .\
 *          '         ~-|      /|    |-~\~~       __--~~
 *                      |-~~-_/ |    |   ~\_   _-~            /\
 *                           /  \     \__   \/~                \__
 *                       _--~ _/ | .-~~____--~-/                  ~~==.
 *                      ((->/~   '.|||' -_|    ~~-/ ,              . _||
 *                                 -_     ~\      ~~---l__i__i__i--~~_/
 *                                 _-~-__   ~)  \--______________--~~
 *                               //.-~~~-~_--~- |-------~~~~~~~~
 *                                      //.-~~~--\
 *                               神兽保佑
 *                              代码无BUG!
 * @author mazaiting
 * @date 2019-07-24
 * @description 无障碍服务工具类
 */
object AccessibilityUtil {

    /**
     * 跳转到无障碍服务设置页面
     * @param context 设备上下文
     */
    fun jumpToSettingPage(context: Context) {
        val intent = Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS)
        intent.flags = Intent.FLAG_ACTIVITY_NEW_TASK
        context.startActivity(intent)
    }

    /**
     * 判断是否有辅助功能权限
     * @param context 上下文
     * @param className 类名
     * @return true 已开启
     *          false 未开启
     */
    fun isAccessibilitySettingsOn(context: Context, className: String): Boolean {
        val activityManager = context.getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
        // 获取正在运行的服务列表
        val runningServices = activityManager.getRunningServices(100)
        if (runningServices.size > 0) {
            for (i in runningServices.indices) {
                val service = runningServices[i].service
                if (className == service.className) {
                    return true
                }
            }
        }
        return false
    }


    /**
     * 根据Text搜索所有符合条件的节点，模糊搜索方式
     *
     * @param text 文本
     * @param isFirst 第一个
     * @return true: 成功; false: 失败.
     */
    fun clickText(text: String, isFirst: Boolean = true): Boolean {
        // 获取根节点
        val rootNodeInfo = AccessibilityOperator.INSTANCE.getRootNodeInfo()
        if (null != rootNodeInfo) {
            // 根据文本查找结点
            val nodeInfo = rootNodeInfo.findAccessibilityNodeInfosByText(text)
            L.d(text + " : " + nodeInfo.size)
            // 检测是否为空
            if (!nodeInfo.isNullOrEmpty()) {
                // 结点
                val info: AccessibilityNodeInfo =
                    if (isFirst) {
                        nodeInfo[0]
                    } else {
                        nodeInfo[nodeInfo.size - 1]
                    }
                return performClick(info)
            }
        }
        return false
    }

    /**
     * 模拟点击
     * 查找本节点 -> 父节点 -> 父节点
     * @param nodeInfo 结点信息
     * @return true 成功； false 失败。
     */
    private fun performClick(nodeInfo: AccessibilityNodeInfo): Boolean {
        // 创建结点
        var info: AccessibilityNodeInfo = nodeInfo
        // 如果可以点击
        if (!nodeInfo.isClickable && null != nodeInfo.parent) {
            // 获取父布局
            info = nodeInfo.parent
            // 判断是否可点击
            if (!info.isClickable && null != info.parent) {
                // 获取父布局
                info = info.parent
            }
        }
        return info.performAction(AccessibilityNodeInfo.ACTION_CLICK)
    }
}